package com.tedu.ds.sessionAndMessage.rabbitMq;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import org.springframework.amqp.core.Message;


import java.io.IOException;

import static com.tedu.ds.sessionAndMessage.config.RabbitMQConfig.DEAD_LETTER_QUEUE_NAME;

@Component
@Slf4j
public class DeadLetterListener {

    /**
     * 处理从死信队列接收到的消息
     * @param message 消息对象
     * @param channel RabbitMQ 通道
     * @throws IOException 处理消息时可能抛出的异常
     */
    @RabbitListener(queues = "#{rabbitMQConfig.deadQueueName}", containerFactory = "deadLetterListenerContainerFactory", ackMode = "MANUAL")  // 指定要监听的死信队列名称和手动确认模式
    public void onDeadLetterMessage(Message message, com.rabbitmq.client.Channel channel) throws IOException {
        try {
            String jsonMessage = new String(message.getBody(), "UTF-8");  // 将消息体转换为字符串
            log.error("接收到死信消息: {}",jsonMessage);

            // 手动发送确认
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);  // 确认消息已被处理
        } catch (IOException e) {
            e.printStackTrace();
            // 如果处理失败，可以选择重新入队或拒绝消息
            channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);  // 拒绝消息并不重新入队
        }
    }
}
